import axios from 'axios'
import config from '@/config'
import store from '@/store'
import ViewUI from 'view-design'
import ErrorCode from '@/libs/errorCode'
import IgnoreHttpError from '@/libs/ignoreHttpError'
import IgnoreToken from '@/libs/ignoreToken'
import router from '../router'
import {removeSessionStore} from '@/utils/storeUtil'

/**
 * 后台请求域名
 */
const baseUrl = process.env.NODE_ENV === 'production' ? config.baseUrl.pro : config.baseUrl.dev

/**
 * 请求参数配置
 */
const getConfig = () => {
  return {
    baseURL: baseUrl,
    timeout: 30000,
    headers: {
      //
    }
  }
}

/**
 * axios请求实例
 */
const instance = axios.create(getConfig())

//跳转登录
function directLogin() {
  router.push({name: 'login'})
}

/**
 * 请求前拦截
 */
instance.interceptors.request.use(config => {
  //如果是不需要token的接口直接返回即可
  if (IgnoreToken.includes(config.url)) {
    return config
  }
  // 获取token
  const token = store.state.user.token
  // 如果token存在，首先校验是否已经过期，如果已经过期，跳转到登录页面
  if(token){
    config.headers.token = token
    return config
  }else{
    //需要登录的请求
    notice({code: 603,msg: ErrorCode[603]})
    directLogin()
  }
  return config
}, error => {
  return Promise.reject(error)
})

/**
 * 请求响应拦截
 */
// 响应拦截
instance.interceptors.response.use(res => {
  console.log('res:{}',res)
  const { data, status } = res
  if(status === 200){
    if(!data.status && ignore(res.config)){
      errorHandle(data)
    }
  }else{
    systemError(status)
  }
  return { data, status }
}, error => {
  console.log('error:{}',error)
  if (error.response) {
    // 请求已发出，但服务器响应的状态码不在 2xx 范围内
    // console.log(error.response.data);
    // console.log(error.response.status);
    // console.log(error.response.headers);
    systemError(error.response.status)
  } else {
    // Something happened in setting up the request that triggered an Error
    if(error.message.indexOf('timeout') != -1){
      //请求超时
      notice({code:602,msg:ErrorCode[602]})
    }else{
      //未知错误
      notice({code:601,msg:ErrorCode[601]})
    }
  }
  return Promise.reject(error)
})

/**
 * 业务异常处理
 * @param {业务异常信息} data
 */
const errorHandle = data => {
  //登录超时处理
  if(data.code === 'CORE1016' || data.code === 'CORE1003'){
    notice({code: 604,msg: ErrorCode[604]})
    store.commit('userLogout')
    removeSessionStore('navList')
    directLogin()
  }else{
    notice({code: data.code,msg: data.msg})
  }
}

/**
 * 系统异常处理
 * @param {状态码} status
 */
const systemError = status => {
  if(status){
    notice({code: status,msg: ErrorCode[status]})
  }else{
    //未知错误
    notice({code: 601,msg: ErrorCode[601]})
  }
}

/**
 * 错误消息通知
 */
const notice = ({code,msg}) => {
  ViewUI.Notice.error({
    //title: '错误：',
    title: code+'-'+msg,
    //duration: 10
  })
}

/**
 * 忽略异常处理
 * @param {请求配置} config
 */
const ignore = config =>{
  if(IgnoreHttpError.includes(config.url)){
    return false
  }else{
    return true
  }
}

export default instance
